指针
对类型T,T*是“到T的指针”类型,也就是说,一个类型为T*的变量能保存一个类型T的对象的地址。例如,
char c = 'a';
char* p = &c; // p保存着c的地址
不幸的是,到数组的指针和到函数的指针需要更复杂的记法:
int* pi; // 到int的指针
char** ppc; // 到字符的指针的指针
int* ap[15]; // 15个到int的指针的数组
int (*fp)(char*) // 到函数的指针,这种函数以char*为参数,返回int
int* f(char*); // 有一个char*参数的函数,返回一个到int的指针
参看4.9.1节有关声明语法的解释,以及附录A中的完整语法。
对指针的基本操作是间接引用,也就是说,引用被指针所指的那个对象。这一操作也被称作间接。间接运算符(前缀)一元*。例如,
char c = 'a';
char* p = &c; // p保存着c的地址
char c2 = *p; // c2 == 'a'
被p所指的变量是c,而c中所存的值是'a'。所以由*p赋给c2的值就是'a'。
对于指向数组元素的指针可以执行一些算术元素(5.3节)。指向函数的指针非常有用,有关问题将在7.7节介绍。
指针的实现是希望能直接映射到程序运行所在的机器上的地址机制。许多机器可以对字节寻址。那些不能这样做的机器多半都有能从机器字中取出字节的硬件功能。在另一方面,还有极少数的机器可以寻址到单个的二进制位。由于这些情况,能够独立地进行分配和通过内部指针类型指向的最小对象就是char。请注意,一个bool量最少爷要占据像char那么大的空间(4.6节)。如果想更紧凑地存储更小的值,你可以使用按位逻辑操作(6.2.4节)或者结构中的位域(C.8.1节)。
🔚